package com.gxa.autoparts.portal.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author R
 * @data 2022-01-07 9:52
 */
@Configuration
public class RabbitConfig {

    //绑定键
    // 消息签发的键
    public final static String SELL_KEY = "sellKey";
    // 存放有过期时间队列的键
    public final static String ORDER_KEY = "orderKey";
    // 死信队列的键
    public final static String DLX_KEY = "dlxKey";

    // 设置交换机
    // 消息签发交换机
    public final static String SELL_EXCHANGE = "sellExchange";
    // 存放有过期时间队列的交换机.
    public final static String ORDER_EXCHANGE = "orderExchange";
    // 死信队列的交换机
    public final static String DLX_EXCHANGE = "dlxExchange";

    // 设置队列名
    // 消息签发的队列
    public final static String SELL_QUEUE = "sellQueue";
    // 存放有过期时间队列
    public final static String ORDER_QUEUE = "orderQueue";
    // 死信队列
    public final static String DLX_QUEUE = "dlxQueue";

    // 消息签发的交换机
    @Bean
    public DirectExchange createSellExchange(){
        return new DirectExchange(SELL_EXCHANGE);
    }

    // 消息签发的队列
    @Bean
    public Queue createSellQueue(){
        return new Queue(SELL_QUEUE);
    }

    // 消息签发交换机和队列的绑定
    @Bean
    public Binding sellBinding(){
        return BindingBuilder.bind(createSellQueue()).to(createSellExchange()).with(SELL_KEY);
    }

    // 死信队列的交换机
    @Bean
    public DirectExchange createDlxExchange(){
        return new DirectExchange(DLX_EXCHANGE);
    }

    // 死信队列
    @Bean
    public Queue createDlxQueue(){
        return new Queue(DLX_QUEUE);
    }

    // 绑定死信交换机和队列
    @Bean
    public Binding dlxBinding(){
        return BindingBuilder.bind(createDlxQueue()).to(createDlxExchange()).with(DLX_KEY);
    }

    // 存放过期时间的队列
    @Bean
    public Queue createOrderQueue(){
        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        //一般设置一下队列的持久化就好,其余两个就是默认false
        // return new Queue("ORDER_QUEUE",true,false,false);
        //再看参数部分: 目的是当消息队列的过期时间TTL到期,消息就会被添加到死信队列中去
        Map<String, Object> arguments = new HashMap<>(2);
        // 绑定死信交换机
        arguments.put("x-dead-letter-exchange", DLX_EXCHANGE);
        // 绑定路由key
        arguments.put("x-dead-letter-routing-key", DLX_KEY);
        return new Queue(ORDER_QUEUE,true,false,false,arguments);
    }

    // 存放过期时间的交换机
    @Bean
    public DirectExchange createOrderExchange(){
        return new DirectExchange(ORDER_EXCHANGE);
    }

    // 绑定过期时间队列的交换机和队列
    @Bean
    public Binding orderBinding(){
        return BindingBuilder.bind(createOrderQueue()).to(createOrderExchange()).with(ORDER_KEY);
    }


   }
